完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-8
在 Day 7,我們用 Celery + Redis 解決了「訓練會卡住」的問題,讓任務能以非同步方式在背景執行。
使用者只需要呼叫 API,就能提交訓練請求並用 task_id
查詢狀態。
不過這裡有個痛點:
curl
指令或 Postman 測試因此,Day 8 的目標是提供一個 最小化的網頁 UI,讓人能「提交任務、輸入 task_id 查詢狀態」,而且不用寫任何前端程式碼。
在 UI 的「提交任務」頁籤,使用者可以:
epochs
, learning_rate
)系統會呼叫 FastAPI /train
API,並立刻回傳一個 task_id
。
在「追蹤進度」頁籤,使用者可以輸入剛拿到的 task_id
。
UI 會每隔 2 秒呼叫 /task/{id}
API,並把任務狀態以 Stepper 流程 顯示:
[ 使用者 (UI) ]
│
▼
Streamlit 介面 ── 提交任務 ──▶ FastAPI (/train)
│ │
│ ▼
│ Celery Broker (Redis DB0)
│ │
│ ▼
│ Celery Worker 執行訓練
│ │
│ ▼
│ 結果存入 Redis Backend (DB1)
│ │
└── 查詢進度 ◀──── FastAPI (/task/{id}) ◀──────
這個流程圖讓人一眼就能理解:UI 只是最外層,背後仍然是 FastAPI + Celery + Redis 的協作。
make start-services # Redis
make start-worker # Celery worker
make start-api # FastAPI
make start-ui # Streamlit UI
task_id
task_id
→ 即時刷新進度這次的改動雖然簡單,但卻大幅降低了使用門檻。過去需要打 API、操作 JSON 的流程,如今只要打開瀏覽器,就能直接提交與追蹤訓練任務。這讓系統不再只是「工程師能用」,而是任何人都能快速上手。
更重要的是,這個 UI 是一個最小可行產品(MVP),為後續的完整前端整合鋪路。隨著任務日誌、進度條、甚至多用戶介面的加入,這套平台將逐步走向更完整、更友好的產品形態。
📎 AI 協作記錄:今日開發指令
請幫我新增一個 Python 版的 Stepper UI,放在 `app/stepper_ui.py`。
需求:
1. 使用 **Streamlit**(首選),或 Gradio(備選)。
2. UI 流程:
- 提供一個輸入框輸入 task_id
- 點擊「查詢」按鈕後,定期呼叫 FastAPI `/task/{id}` API
- 把回傳的狀態(PENDING, STARTED, SUCCESS, FAILURE)顯示成 Stepper 流程
3. Stepper 規則:
- Step 1: PENDING
- Step 2: STARTED
- Step 3: SUCCESS / FAILURE
4. UI 要能自動刷新(例如每隔 2 秒輪詢一次)。
5. 執行方式:`streamlit run app/stepper_ui.py`
目標:
- 讓使用者可以在瀏覽器中輸入 task_id,清楚看到訓練任務的進度。
- 這是一個最小化的 Demo,不需要做美化,只要能用即可。